package org.fujay.langchain4jserver.infrastructure.config; // 新建包

import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.opensearch.OpenSearchEmbeddingStore;
import org.opensearch.client.opensearch.OpenSearchClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * 配置向量存储，覆盖 commons-langchain4j 中的默认内存实现
 */
@Configuration
public class VectorStoreConfig {

    /**
     * 定义 OpenSearch EmbeddingStore Bean 使用 @Primary 确保覆盖 commons 中的默认 Bean
     *
     * @param openSearchClient 由 commons-langchain4j 的 RagConfig 提供
     * @return OpenSearchEmbeddingStore 实例
     */
    @Bean
    @Primary
    public EmbeddingStore<TextSegment> openSearchEmbeddingStore(OpenSearchClient openSearchClient) {
        // TODO: 确定 OpenSearch 索引名称的来源和管理方式
        // 方案1: 固定索引名称 (从配置读取) - 适用于所有知识库共享一个索引，用元数据区分
        // 方案2: 动态索引名称 (不支持直接配置，需要自定义逻辑或包装器) - 适用于每个知识库一个索引
        // 方案3: 使用 Langchain4j-OpenSearch 的默认行为（可能需要查看其文档）

        // 假设暂时使用一个固定的索引名 "langchain4j-embeddings"
        String defaultIndexName = "langchain4j-embeddings";

        // 忽略 Linter 错误，假设 OpenSearchEmbeddingStore 可用
        return OpenSearchEmbeddingStore.builder()
                .openSearchClient(openSearchClient)
                .indexName(defaultIndexName)
                // .dimension(1536) // 通常不需要在构建 Store 时指定维度，维度由 EmbeddingModel 决定
                .build();
    }
}
